#include<stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>

// 循环双链表

#define InitSize 10    // 初始大小
typedef int ElemType;  // 定义元素类型

typedef struct DNode
{
    // 数据类型
    ElemType data;
    // 前驱和后驱指针
    struct DNode *prior, *next;
}DNode, *DLinklist;

// 初始化空的循环双链表
bool InitDLinkList(DLinklist &L){
    L = (DNode *)malloc(sizeof(DNode));
    if (L==NULL) return false;
    L->data = 0;
    L->prior = L;
    L->next = L;
    return true;
}

// 判断结点是否为循环双链表的表尾结点
bool isTail(DLinklist L, DNode *p){
    if(p->next==L) return true;
    else return false;
}

// 按位插入
bool InsertDNode(DLinklist &L, int i, ElemType e){
    if (i<1) return false;
    DNode *p;
    int j=0;
    p = L;
    // 判断是否只有一个元素
    if (L->next!=L){
        while (p->next!=L && j<i-1) {     // 循环找到第i-1个结点
            p=p->next;
            j++;
        }
    }
    DNode *s = (DNode *)malloc(sizeof(DNode));
    s->data = e;
    s->next = p->next;
    p->next->prior = s;
    p->next = s;                  // 将结点s连到p之后
    s->prior = p;
    return true;                  // 插入成功  
}

// 判空
bool Empty(DLinklist L){
    if (L->next==L) return true;
    else return false;
}

// 输出
void PrintList(DLinklist L){
    DNode *h = L;
    L = L->next;
    while (L != h) {
        printf("%d->%d\n", L->data, L->next->data);
        L = L->next;
    }
}

int main(){
    DLinklist L;
    InitDLinkList(L);
    InsertDNode(L, 1, 11);
    InsertDNode(L, 1, 12);
    InsertDNode(L, 1, 13);
    InsertDNode(L, 2, 22);
    InsertDNode(L, 3, 33);
    InsertDNode(L, 4, 44);
    PrintList(L);
    printf("\n");
    system("pause");
    return 0;
}